|
Date :.......................... 14 mai 1993 Programme :........................ ZOOL Protection :......... MOT DE PASSE Outils : ...............SOFT-ICE V2.50 Temps passé : ..........15 MINUTES Fichier : ......................................... Société : .....................GREMLINS Divers : ......Confection d'un lançeur. Origine :................................... L.F. Numéro : ..................................214 |
Aucun effort n'est fait pour "cacher" l'endroit de la protection. Les caractères sont appelés par l'INT 16 SF 00. Le test de la touche ENTER suit, puis deux mots sont comparés et, si la réponse est mauvaise on quitte. Les fichiers ne semblent pas être cryptés mais on ne trouve aucune trace des chaînes d'octets à modifier ! Je confectionne un lançeur centré sur l'INT 16 sf 00. Pronfondeur de recherche: 80h. Au premier essai j'entends les 3 bips fatidiques, signe que mon lançeur a réussi à supprimer la protection. Mais stupeur, la protection semble toujours être là. Une erreur de programmation peut-être ? Je vérifie, mais tout semble correct. Je lance SOFT-ICE et je déroule mon lançeur au pas à pas. Il trouve bien le JNZ qu'il remplace par um JMP. Alors quoi ? Le programme remettrait-il en place le saut juste après l'appel de l'INT 16 ? Impossible. Aucune instruction ne semble le faire et aucun CALL n'est appelé entre temps. En examinant attentivement mes pointeurs SEGMENT:OFFSET je m'aperçois que la valeur du SEGMENT de mon patch remplacé ne coresspond pas au SEGMENT o se trouve le JNZ à modifier. Mon programme a donc trouvé un autre 0374 bien avant le patch réel. En fait, au bout de quatre dépilages! Deux solutions: dépiler 4 fois en popant sans rien tester ou bien tester un deuxième mot pour être sûr d'avoir trouvé le bon endroit. Endroit de la demande des caractères: CS=10DE CS:1BAB B400 MOV AH,00 CS:1BAD CD16 INT 16 Test de la touche ENTER: CS:1BD1 3C0D CMP AL,0D CS:1BD3 742A JZ 1BFF Test du code entré ( deux mots ): CS:1BFF A1941C MOV AX,[1C94] CS:1C02 8B369B1C MOV SI,[1C9B] CS:1C06 3B4404 CMP AX,[SI+04] CS:1C09 7403 JZ 1C0E ; SI 1ER TEST OK --> 1C0E CS:1C0B E9FBFE JMP 1B09 ; SI PAS OK. CS:1C0E A0961C MOV AL,[1C96] CS:1C11 3A4406 CMP AL,[SI+06] CS:1C14 7403 JZ 1C19 ; SI 2EME TEST OK -> 1C19 CS:1C16 E9F0FE JMP 1B09 ; SI PAS OK. CS:1C19 E8BE20 CALL 3CDA ; SUITE DU JEU. CS:1C1C C3 RET Il suffit donc de forcer le premier test vers 1C19 à l'aide d'un JMP. Ci-dessous les paramètres du lançeur: ; PATCH POUR LE PROGRAMME ZOOL ; DETOURNEMENT DE L'INT 16 sf 00 ; ;****************************************************************************** ; ZONE A INITIALISER adr_ip1 equ 1c09h ; Adresse dont le contenu est à modifier. ; Adresse directe. anc_val equ 0374h ; Valeur d'origine à rechercher, inversée. nouv_val equ 0eebh ; Nouvelle valeur inversée: EB0E --> JMP 1C19. INT_DET equ 16h ; Le numéro de l'INT que l'on veut utiliser. nb equ 080h ; Nombre de dépilage. BEEP_TONE equ 440 ; Fréquence de la note. sous_f equ 00 ; Valeur de la sous-fonction. ;---------------------------- int détournée -------------------------------- int_entry proc far _int: jmp apres _SAUVE_SP dw 0,0 apres: push ax push ds push bx push cx push dx pushf ; Push flags cmp ah,sous_f jnz sort mov dx,301h in al,dx mov word ptr cs:[_SAUVE_SP],sp mov cx,nb prochain: pop ds ; Je suis obligé de faire 4 dépilages à la pop ds ; main car un "hit" est trouvé au quatrième pop ds ; dépilage... c'est le hasard. pop ds ; ---------> HIT HIT HIT ! dec cx jz s cmp word ptr ds:[adr_ip1],anc_val ; Si ok on patche. jnz prochain mov word ptr ds:[adr_ip1],nouv_val ; On y place le patch. xor bx,bx mov ds,bx mov bx,word ptr cs:data_9 ; Je remets manuellement mov ds:[INT_DET*4],bx ; en place le vecteur mov bx,word ptr cs:data_9+2 ; de l'INT détournée. mov ds:[INT_DET*4+2],bx mov dx,301h in al,dx . . . ;* Sound - Sounds speaker with the following tone and duration: ; Ici la routine sonore qui n'est pas listée car c'est la même pour tous mes ; patchs. . . . s: mov sp,word ptr cs:[_SAUVE_SP] sort: popf pop dx pop cx pop bx pop ds pop ax jmp dword ptr cs:data_9 int_entry endp